#include "utils.h"
#include <stdlib.h>

namespace utils
{
	void normalize(core::vector3df & v, float norm)
	{
		static float _normal;
		_normal = norm / normal(v);
		v.X /= _normal;
		v.Y /= _normal;
		v.Z /= _normal;
	}

	float normal(const core::vector3df & v)
	{
		return sqrtf(v.X * v.X + v.Y * v.Y + v.Z * v.Z);
	}

	float normalizeOptimzed(core::vector3df & v, float norm)
	{
		static float _normal;
		static float _return;
		_return = normal(v);
		_normal = norm / _return;
		v.X /= _normal;
		v.Y /= _normal;
		v.Z /= _normal;
		return _return;
	}

	bool aligned(core::vector3df & r, core::vector3df & d, float error)
	{
		static float l, b, c;
		// salvo errores de divicion por cero con esto y agrego algo de error en el calculo..mmm:
		if (r.X == 0.0f) r.X = error * 0.5f;

		if (r.X != 0.0f)
		{
			l = d.X / r.X;
			b = r.Y * l;
			c = r.Z * l;
			return (b <= d.Y + error) && (b >= d.Y - error) && (c <= d.Z + error) && (c >= d.Z - error);
		}
		/*
		else if (r.Y != 0)
		{
			l = d.Y / r.Y;
			b = r.X * l;
			c = r.Z * l;
			return (b <= d.X + error) && (b >= d.X - error) && (c <= d.Z + error) && (c >= d.Z - error);
		}
		else if (r.Z != 0)
		{
			l = d.X / r.X;
			b = r.Y * l;
			c = r.Z * l;
			return (b <= d.Y + error) && (b >= d.Y - error) && (c <= d.Z + error) && (c >= d.Z - error);
		}
		*/
		// aca no deberia llegar nunca...pero bueh..por si me estoy olvidando de algo.
		return false;
	}
/*
	void Utils::RotateMatrix( const Matrix & m, float angle)
	{
		// y aca va la transformacion
	}
*/
}// fin del namespace utils